package org.ko.core.dao.hibernate4;

import java.io.Serializable;
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.criterion.Criterion;
import org.ko.core.dao.support.Updater;

public interface BaseDao<T, ID extends Serializable> {

	/**
	 * @see Session.get(Class,Serializable)
	 * @param id
	 * @return 持久化对象
	 */
	public T get(ID id);
	
	
	public ID save(T entity);
	public void delete(ID id);
	public void delete(T entity);
	void delete(ID[] ids);

	/**
	 * @see Session.get(Class,Serializable,LockMode)
	 * @param id
	 *            对象ID
	 * @param lock
	 *            是否锁定，使用LockMode.UPGRADE
	 * @return 持久化对象
	 */
	public T get(ID id, boolean lock);

	/**
	 * 按属性查找对象列表
	 */
	public List<T> findByProperty(String property, Object value);

	/**
	 * 按属性查找唯一对象
	 */
	public T findUniqueByProperty(String property, Object value);

	/**
	 * 按属性统计记录数
	 * 
	 * @param property
	 * @param value
	 * @return
	 */
	public int countByProperty(String property, Object value);

	public int countByProperty(Criterion... criterions);
	
	public int maxByProperty(String property);
	/**
	 * 按Criterion查询列表数据.
	 * 
	 * @param criterion
	 *            数量可变的Criterion.
	 */
	@SuppressWarnings("unchecked")
	public List findByCriteria(Criterion... criterion);

	/**
	 * 通过Updater更新对象
	 * 
	 * @param updater
	 * @return
	 */
	public T updateByUpdater(Updater<T> updater);

	/**
	 * 根据Criterion条件创建Criteria,后续可进行更多处理,辅助函数.
	 */
	public Criteria createCriteria(Criterion... criterions);

}